После долгого времени без получения ошибок такого рода, в моем текущем проекте я столкнулся с этой проблемой с одним моим классом сущностей. У меня есть это:
@Entity
public class Produto extends Model {
...
@OneToMany(fetch = FetchType.EAGER)
@OrderColumn
private List<Arquivo> versaoGratuita;
@OneToMany(fetch = FetchType.EAGER)
@OrderColumn
private List<Arquivo> versaoPaga;
...
}
, которое обновляется с помощью этого метода в моем классе Дао:
public abstract class Dao<E> {
@Autowired
private EntityManagerFactory factory;
...
public EntityManager getEntityManager() {
return factory.createEntityManager();
}
...
public E update(E object) {
EntityManager entityManager = getEntityManager();
entityManager.getTransaction().begin();
entityManager.merge(object);
entityManager.getTransaction().commit();
entityManager.close();
return object;
}
...
}
, а для сущности Arquivo
у меня есть PropertyEditor
класс:
public class ArquivoEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) {
if (!text.equals("")) {
Integer id = Integer.parseInt(text);
ArquivoService serv = new ArquivoService();
org.loja.AppContextHolder.getContext().getAutowireCapableBeanFactory().autowireBean(serv);
Arquivo arquivo = (Arquivo) serv.findBy("id", id);
setValue(arquivo);
} else {
setValue(null);
}
}
}
и когда я пытаюсь обновить класс Produto
(операция вставки работает нормально, без ошибок), я получаю эту ошибку:
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: org.loja.model.arquivo.Arquivo
, но сущность иногда кажется обновляться правильно? Как я уже сказал, у меня давно такой вопрос. Кто-то может дать подсказку, как устранить эту ошибку go? Я знаю, я сказал, что, кажется, хранит сущность Arquivo
, но я думаю, что, если выдаст ошибку, это может вызвать серьезные проблемы позже?
update
in форма, используемая для отправки данных сущности на сервер, этот атрибут Arquivo
представляется следующим образом (код html с тимилиф):
строка:
<input th:each="arq,stat : ${command.versaoGratuita}" th:if="${#strings.equals(arq.type, 'exe')}" type="hidden" th:name="${'versaoGratuita[' + stat.index + ']'}" th:value="${arq.id}"/>
- это тот, который содержит атрибут id
, используемый классом PropertyEditor
для извлечения сущности из базы данных.